package com.bluedot.www.core.utils;


import com.bluedot.www.core.common.SnowflakeIdWorker;

import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.Date;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Random;

/**
 * <p>数据库工具类</p>
 * 自动生成id；
 * 获取当前时间；
 * 去除timestamp的毫秒值；
 * 生成随机账户名；
 *
 * @author He Peng
 * @version 1.0
 * @date 2021/8/31 18:56
 */
public class DbUtil {

    private static final SnowflakeIdWorker ID_WORKER = new SnowflakeIdWorker(0, 0);

    private static final int ACCOUNT_NAME = 10;

    /**
     * 根据时间戳生成id
     *
     * @return java.lang.Long
     * @author He Peng
     * @date 2021/8/31 18:58
     */
    public static Long generateId() {
        return ID_WORKER.nextId();
    }


    /**
     * 获取当前时间
     *
     * @return java.sql.Timestamp 时间戳
     * @author He Peng
     * @date 2021/8/31 21:58
     */
    public static Timestamp getCurrentTime() {
        return new Timestamp(System.currentTimeMillis());
    }

    /**
     * 格式化Timestamp，去除数据
     * <strong>注意：Timestamp类型都有毫秒值</strong>
     *
     * @param dt: 原时间戳
     * @return java.sql.Timestamp
     * @author He Peng
     * @date 2021/8/31 22:02
     */
    public static String formatTimestamp(Timestamp dt) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return df.format(dt);
    }

    /**
     * 格式化sql.Date，方便excel表格导入导出
     *
     * @param dt 原时间sql.Date
     * @return java.lang.String
     * @author He Peng
     * @date 2021/9/8 14:38
     */
    public static String formatSqlDate(Date dt) {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        return df.format(dt);
    }

    /**
     * md5加密
     *
     * @param str 原密码
     * @return java.lang.String
     * @author GUOZHIPENG
     * @date 2021/9/1 20:14
     */
    public static String getMd5(String str) {
        byte[] digest = null;
        try {
            MessageDigest md5 = MessageDigest.getInstance("md5");
            digest = md5.digest(str.getBytes(StandardCharsets.UTF_8));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        //16是表示转换为16进制数
        return fillMD5(new BigInteger(1, digest).toString(16));
    }

    /**
     * BigInteger会把0省略掉，需补全至32位
     *
     * @param md5 md5字符串
     * @return java.lang.String
     * @author GUOZHIPENG
     * @date 2021/9/7 10:52
     */
    private static String fillMD5(String md5) {
        return md5.length() == 32 ? md5 : fillMD5("0" + md5);
    }

    /**
     * 生成随机账户名
     *
     * @return java.lang.String
     * @author He Peng
     * @date 2021/9/1 20:32
     */
    public static String generateAccount() {
        StringBuffer val = new StringBuffer();
        Random random = new Random();

        //参数length，表示账户长度
        for (int i = 0; i < ACCOUNT_NAME; i++) {

            String charOrNum = random.nextInt(2) % 2 == 0 ? "char" : "num";
            //输出字母还是数字
            if ("char".equalsIgnoreCase(charOrNum)) {
                //输出是大写字母还是小写字母
                int temp = random.nextInt(5) % 2 == 0 ? 65 : 97;
                val.append((char) (random.nextInt(26) + temp));
            } else {
                val.append(String.valueOf(random.nextInt(10)));
            }
        }
        return val.toString();
    }

    public static void main(String[] args) {
        String md5 = DbUtil.getMd5("12345678");
        System.out.println(md5);
    }
}
